# app/__init__.py
import os
from logging.handlers import RotatingFileHandler

from flask import Flask
from flask_limiter.util import get_remote_address

from app.config import Config
from app.extensions import db
from apscheduler.schedulers.background import BackgroundScheduler
from flask_cors import CORS
from flask_limiter import Limiter

import logging


def create_app():
    app = Flask(__name__)

    CORS(
        app,
        supports_credentials=True,  # 允许跨域请求携带 cookies
        expose_headers=['Authorization']  # 允许前端获取 Authorization 头
    )
    app.config.from_object(Config)

    limiter = Limiter(
        app=app,
        key_func=get_remote_address,  # 按客户端IP限制
        default_limits=["200 per day", "50 per hour"],  # 全局默认限制（所有接口适用）
        storage_uri="memory://"  # 开发环境用内存存储，生产环境建议用redis
    )
    limiter.init_app(app)
    # 初始化数据库
    db.init_app(app)

    # 配置日志
    log_dir = os.path.join(os.path.dirname(__file__), 'logs')  # 日志存放目录
    os.makedirs(log_dir, exist_ok=True)
    log_file = os.path.join(log_dir, 'app.log')

    # 设置日志格式
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )

    # 日志轮转：单个文件最大10MB，保留10个备份
    file_handler = RotatingFileHandler(
        log_file,
        maxBytes=10 * 1024 * 1024,  # 10MB
        backupCount=10,
        encoding='utf-8'
    )
    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.INFO)  # 记录INFO及以上级别日志

    # 控制台日志
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    console_handler.setLevel(logging.DEBUG)  # 控制台显示DEBUG及以上

    # 注册日志处理器
    app.logger.addHandler(file_handler)
    app.logger.addHandler(console_handler)
    app.logger.setLevel(logging.DEBUG)  # 全局日志级别

    # 测试日志是否生效
    app.logger.info("应用启动成功")


    # 注册路由蓝图（先导入再注册）
    from routes.detection import detection_bp
    from routes.street import street_bp
    from routes.user import user_bp
    from routes.auth import auth_bp

    app.register_blueprint(detection_bp)
    app.register_blueprint(street_bp)
    app.register_blueprint(user_bp)
    app.register_blueprint(auth_bp)

    # 初始化定时任务（每日更新街道统计）
    from routes.street import update_street_stats  # 导入统计函数
    scheduler = BackgroundScheduler()
    scheduler.add_job(update_street_stats, 'cron', hour=0)  # 每天凌晨执行
    scheduler.start()

    return app
